﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Binaria.Core;
using Com.Binaria.Core.Enumeracion;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.Dom;
using Com.Binaria.SISCOB.Funcional.DTO;

namespace Com.Binaria.SISCOB.Mgr
{

    public class DocumentoTransaccionMgr : IDocumentoTransaccionMgr
    {
        #region ATRIBUTOS A EXPONER AL USUARIO
        public IDocumentoTransaccionDom iDocumentoTransaccionDom;
        public ICuentaCorrienteMgr iCuentaCorrienteMgr;
        #endregion

        #region Miembros de IDocumentoTransaccionMgr
        public DocumentoTransaccionFuncionalDTO GetById(ContextoDTO oContexto, System.Int32? Id)
        {
            DocumentoTransaccionFuncionalDTO oItem = null;
            //
            try
            {
                DocumentoTransaccionDTO tmp = iDocumentoTransaccionDom.BuscarDocumentoTransaccionPorId(oContexto, Id);
                if (tmp != null)
                {
                    oItem = new DocumentoTransaccionFuncionalDTO();
                    oItem.Id = tmp.Id;
                    oItem.Monto = Convert.ToInt64(tmp.Monto);
                    oItem.FchDocumento = tmp.FchDocumento;
                    oItem.FchUpdate = tmp.FchUpdate;
                    oItem.Glosa = tmp.Glosa;
                    oItem.NmrDocumento = tmp.NmrDocumento;
                    oItem.CuentaCorriente = (int)tmp.IdCuentaCorriente;
                    oItem.EstaActivo = tmp.EstaActivo.Value;
                    oItem.Sucursal = (tmp.IdSucursal != null ? tmp.IdSucursal.Value : -1);
                    oItem.UserName = tmp.UserName;

                    oItem.CuentaCorrienteFDTO = iCuentaCorrienteMgr.GetById(oContexto, tmp.IdCuentaCorriente);
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<DocumentoTransaccionFuncionalDTO> GetAll(ContextoDTO oContexto)
        {
            IList<DocumentoTransaccionFuncionalDTO> oItem = null;
            //
            try
            {
                IList<DocumentoTransaccionDTO> tmp = iDocumentoTransaccionDom.BuscarDocumentoTransaccionTodos(oContexto);
                if (tmp != null)
                {
                    oItem = new List<DocumentoTransaccionFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        DocumentoTransaccionFuncionalDTO oFDto = new DocumentoTransaccionFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.Monto = Convert.ToInt64(tmp[i].Monto);
                        oFDto.FchDocumento = tmp[i].FchDocumento;
                        oFDto.FchUpdate = tmp[i].FchUpdate;
                        oFDto.Glosa = tmp[i].Glosa;
                        oFDto.NmrDocumento = tmp[i].NmrDocumento;
                        oFDto.CuentaCorriente = tmp[i].IdCuentaCorriente.Value;
                        oFDto.EstaActivo = tmp[i].EstaActivo.Value;
                        oFDto.Sucursal = (tmp[i].IdSucursal != null ? tmp[i].IdSucursal.Value : -1);
                        oFDto.UserName = tmp[i].UserName;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<DocumentoTransaccionFuncionalDTO> GetBy(ContextoDTO oContexto, DocumentoTransaccionFuncionalDTO item)
        {
            IList<DocumentoTransaccionFuncionalDTO> oItem = null;
            //
            try
            {
                IList<DocumentoTransaccionDTO> tmp = null;
                if (item == null)
                    tmp = iDocumentoTransaccionDom.BuscarDocumentoTransaccionTodos(oContexto);
                else
                {
                    DocumentoTransaccionDTO oDto = new DocumentoTransaccionDTO();
                    oDto.Id = item.Id;
                    if (item.Monto > 0) oDto.Monto = item.Monto;
                    oDto.FchDocumento = item.FchDocumento;
                    oDto.FchUpdate = item.FchUpdate;
                    if (!string.IsNullOrEmpty(item.Glosa)) oDto.Glosa = item.Glosa;
                    if (!string.IsNullOrEmpty(item.NmrDocumento)) oDto.NmrDocumento = item.NmrDocumento;
                    //
                    tmp = iDocumentoTransaccionDom.BuscarDocumentoTransaccionFiltro(oContexto, oDto);
                }

                if (tmp != null)
                {
                    oItem = new List<DocumentoTransaccionFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        DocumentoTransaccionFuncionalDTO oFDto = new DocumentoTransaccionFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.Monto = Convert.ToInt64(tmp[i].Monto);
                        oFDto.FchDocumento = tmp[i].FchDocumento;
                        oFDto.FchUpdate = tmp[i].FchUpdate;
                        oFDto.Glosa = tmp[i].Glosa;
                        oFDto.NmrDocumento = tmp[i].NmrDocumento;
                        oFDto.CuentaCorriente = (int)tmp[i].IdCuentaCorriente;
                        oFDto.EstaActivo = tmp[i].EstaActivo.Value;
                        oFDto.Sucursal = (int)tmp[i].IdSucursal;
                        oFDto.UserName = tmp[i].UserName;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public bool Save(ContextoDTO oContexto, DocumentoTransaccionFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);

            try
            {

                DocumentoTransaccionDTO oDto = new DocumentoTransaccionDTO();
                oDto.Id = item.Id;
                oDto.Monto = item.Monto;
                oDto.FchDocumento = item.FchDocumento;
                oDto.FchUpdate = item.FchUpdate;
                oDto.Glosa = item.Glosa;
                oDto.NmrDocumento = item.NmrDocumento;
                oDto.IdSucursal = item.Sucursal;
                oDto.IdCuentaCorriente = item.CuentaCorriente;
                oDto.EstaActivo = item.EstaActivo;
                oDto.UserName = item.UserName;

                if (IsExist)
                {
                    iDocumentoTransaccionDom.RegistrarDocumentoTransaccion(oContexto, new List<DocumentoTransaccionDTO>() { oDto }, EnumRegistrarAccion.Modificar);
                }
                else
                    iDocumentoTransaccionDom.RegistrarDocumentoTransaccion(oContexto, new List<DocumentoTransaccionDTO>() { oDto }, EnumRegistrarAccion.Agregar);

                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }

        public bool Delete(ContextoDTO oContexto, DocumentoTransaccionFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);

            try
            {
                DocumentoTransaccionDTO oDto = new DocumentoTransaccionDTO();
                oDto.Id = item.Id;
                
                if (IsExist)
                {
                    iDocumentoTransaccionDom.RegistrarDocumentoTransaccion(oContexto, new List<DocumentoTransaccionDTO>() { oDto }, EnumRegistrarAccion.Eliminar);
                }
                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }
        #endregion
    }
}
